"""
使用装饰器封装算法
因为分页适用到很对页面上面，我们只需将其算法封装起来
等到需要用的时候对其进行调用即可
"""


class Page:
    def __init__(self, page, page_count, page_url, per_page_show=10, per_page_data_count=10):
        """
        初始化分页所需要的所有的参数
        这些参数都是在调用的时候需要传入的参数
        :param page:            当前页
        :param page_count:      总页数
        :param page_url:        设置分页器点击跳转的uri
        :param per_page:        每页展示多少个分页器,默认值为10
        :param per_page_data:   每页要展示出来的数据，默认值为10
        """
        # 初始化获取当前页
        self.page = page
        # 初始化获取传入的总页数
        self.page_count = page_count
        # 初始化分页按钮的路由
        self.page_url = page_url
        # 初始化展示分页器的数量
        self.per_page_show = per_page_show
        # 初始化每页需要展示的数据量
        self.per_page_data_count = per_page_data_count
        """
        计算当前页码两端的平均页码值
        实现让页码不停的滚动的效果（动态变换分页按钮）
        """
        avg_page_count = per_page_show // 2

        self.first_page = 1
        self.last_page = page_count + 1
        if page_count > per_page_show:
            # 页码开始循环的位置
            self.first_page = page - avg_page_count
            # 页码结束循环的位置
            self.last_page = page + avg_page_count

            # 对起始位置进行判断，不可出现负数页
            if self.first_page <= avg_page_count:
                self.first_page = 1
                print(self.first_page)
                """
                因为取值会遵循取小不取大，所以要想取到正确的页码
                需要对最后的一个页码数值+1
                这里面对最后页的设置，是为了避免出现分页器数量显示超的情况            
                """
                self.last_page = per_page_show + 1

            if self.last_page > page_count:
                """
                当最后页大于总页数的时候
                将最后页的数额直接设置为最大页+1页
                即直接向用户呈现最后一页
                """
                self.last_page = page_count + 1
                self.first_page = page_count - per_page_show + 1
                # 控制有人恶意输入很大的页码


        """
        取数据时的开始位置 
            当前页的前一页 乘 每页展示数据的数量
        """
        self.start_pos = (self.page - 1) * per_page_data_count

        # 取数据时的结束位置
        self.end_pos = self.page * per_page_data_count


    def show_page(self):
        # 根据上面的算法拼接分页器的html标签
        # 首页按钮
        page_html = """
        <nav aria-label="Page navigation">
            <ul class="pagination">
                <li>
                    <a href="{}" aria-label="Previous">
                        <span aria-hidden="true">首页</span>
                    </a>
                </li>
        """.format(self.page_url, )
        # 上一页按钮,需要对其进行判断，使其不出现负数页的情况
        if self.page == 1:
            """
            当当前页为第一页的时候，禁用上一页按钮
            """
            page_html += """
            <li class="disabled">
                <a href="#" aria-label="Previous">
                    <span aria-hidden="true">上一页</span>
                </a>
            </li>
            """
        else:
            """
            当当前页不为第一页的时候，点击上一页，跳转到当前页的前一页
            """
            page_html += """
            <li>
                <a href="{}?page={}" aria-label="Previous">
                    <span aria-hidden="true">上一页</span>
                </a>
            </li>
            """.format(self.page_url, self.page - 1)
        """
        循环遍历出中间的分页器按钮
        对其进行判断，如果是当前页，则将其的a标签属性改变，不发生跳转
        """
        for p in range(self.first_page, self.last_page):
            p = str(p)

            if str(self.page) == p:

                page_html += '<li class="active"><a href="#">' + p + '</a></li>'
            else:
                page_html += '<li><a href="' + self.page_url + '?page=' + p + '">' + p + '</a></li>'

        # 下一页按钮
        if self.page_count == self.page:
            """
            对下一页按钮进行判断，当当前页为最后一页的时候，禁用下一页按钮
            """
            page_html += """
            <li class="disabled">
                <a href="{}?page={}" aria-label="Previous">
                    <span aria-hidden="true">下一页</span>
                </a>
            </li>
            """.format(self.page_url, self.page_count)
        else:
            """
            当当前页不是最后一页的时候，点击下一页按钮跳转至下一页
            """
            page_html += """
            <li>
                <a href="%s?page=%d" aria-label="Previous">
                    <span aria-hidden="true">下一页</span>
                </a>
            </li>
            """ % (self.page_url, self.page + 1)

        # 尾页
        page_html += """
                <li>
                    <a href="{}?page={}" aria-label="Previous">
                        <span aria-hidden="true">尾页</span>
                    </a>
                </li>
            </ul>
        </nav>
        """.format(self.page_url, self.page_count)

        return page_html